package com.decade.controller;

import com.decade.pojo.Result;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class JsonController {

    /**
     * @ResopnseBody 表示不再将响应结果理解为view，
     * 并将响应结果转换为json格式（前提是必须满足转换json格式数据条件）
     * 写到响应体，响应到客户端
     * */
    @GetMapping("getJson")
    @ResponseBody
    public Result getJson(){
        Result R= new Result();
        R.setCode(200);
        R.setMessage("ok");
        return R;
        //当此对象在返回时候，spring web模块会调用jackson api，将返回值转换为json格式字符串
        //底层转换原理分析？
        //基于pojo对象的get方法进行字符串的拼接
        //pojo中的get方法中，get单词后面的名字作为key（首字母小写），value为get方法的返回值
    }

    @ResponseBody
    @GetMapping("getMapJson")
    public Map<String,Object> getMapJosn(){
        Map<String,Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("message", "ok");
        return map;
    }

    @ResponseBody
    @GetMapping("getListJson")
    public List<Map<String,Object>> getListJosn(){
        Map<String,Object> map = new HashMap<>();
        List<Map<String,Object>> list = new ArrayList<>();

        map.put("name", "张三");
        map.put("message", "ok");
        list.add(map);
        Map<String,Object> map1 = new HashMap<>();
        map1.put("name", "李四");
        map1.put("message", "ok");
        list.add(map1);
        return list;
    }

    //了解：自己拼接json串
    @ResponseBody
    @RequestMapping("doPrintJsonString")
    public String doPrintJsonString(){
        String jsonStr = "{code:200,message:\"ok\"}";
        return jsonStr;
    }

    //了解：底层怎么将对象转换成字符串
    @ResponseBody
    @GetMapping("doReponseJsonString")
    public void doReponseJsonString(HttpServletResponse response) throws IOException {
        Result R= new Result();
        R.setCode(200);
        R.setMessage("服务端处理成功了");
        System.out.println("执行前");
        //构建jacson中的ObjectMapper对象，基于此对象将pojo对象转换为json字符串
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonStr = objectMapper.writeValueAsString(R);
        System.out.println("执行后");
        //设置响应数据的编码
        //告诉客户端，要向他响应的数据类型为text/html，编码为utf-8.请以这种编码进行数据呈现
        response.setContentType("text/html;charset=utf-8");
        //获取输出流对象
        PrintWriter out = response.getWriter();
        //基于流对象将json串写到客户端
        out.print(jsonStr);
    }
}
